import requests
import json






#_______________________________________________________________________________________________________________________
#@ 类
class WEIBO_REQUESTS(object):
    #___________________________________________________________________________________________________________________
    #@ 类变量
    HEADERS = {
        'User-agert':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Mobile Safari/537.36 Edg/90.0.818.62'
    }    
    #___________________________________________________________________________________________________________________
    #@ 初始化
    def __init__(self):
        pass
    #___________________________________________________________________________________________________________________
    #@ uid    =>    tabs 中的 containerid 及对应的 title 
        ''' 功能：#!(暂不用·未测试) 接收 1个 uid（用户ID），主要获取 tabs 中的 containerid 及对应的 title（不同的tab有不同的id，其中包括主页、微博...）
            @参数：
                uid_parameter：用户ID
            @返回：
                dataset：整理好的数据，列表，元素为字典类型
            '''
    def get_tabs_info_by_uid(self,uid_parameter):
        url = 'https://m.weibo.cn/api/container/getIndex?type=uid&value='+str(uid_parameter)
        response = requests.get(url,self.HEADERS)
        if str(response)!='<Response [200]>':
            print(response)
            return
        data = json.loads(response.text)
        ok = data['ok']
        if ok != 1:
            print("返回数据有问题！")
            return
        dataset = data['data']['tabsInfo']['tabs']
        return dataset
    def get_tabs_info_by_uid_and_shortcode(self,uid_parameter):
        return json.loads(requests.get('https://m.weibo.cn/api/container/getIndex?type=uid&value='+str(uid_parameter),self.HEADERS).text)['data']['tabsInfo']['tabs']
    #___________________________________________________________________________________________________________________
    #@ uid    =>    title='微博' 的 containerid 
        ''' 功能：#!(暂不用) 由 uid 获取 title='微博' 的 containerid 
            参数：
                uid_parameter：
            返回：
                字符串
            注意：
                #todo 此 containerid 是主界面下的 "微博" 页面，可能包含广告，暂不用于 "专门爬取某用户的所有微博" 这一功能
            '''
    def get_weibo_containerid_by_uid(self,uid_parameter):
        response = requests.get('https://m.weibo.cn/api/container/getIndex?type=uid&value='+str(uid_parameter),self.HEADERS)
        if str(response)!='<Response [200]>':
            print(response)
            print("获取用户 = " + uid_parameter + "，title = '微博' 的 containerid 失败！")
            return
        data = json.loads(response.text)
        ok = data['ok']
        if ok != 1:
            print("获取用户 = " + uid_parameter + "，title = '微博' 的 containerid 失败！")
            return
        tabs = data['data']['tabsInfo']['tabs']
        for tab in tabs:
            if tab['tabKey'] == "weibo" and tab['title'] == "微博":
                return tab['containerid']
        print("用户 = " + uid_parameter + "，title = '微博' 的 containerid 不存在！")
        return
    def get_weibo_containerid_by_uid_and_shortcode(self,uid_parameter):
        tabs = json.loads(requests.get('https://m.weibo.cn/api/container/getIndex?type=uid&value='+str(uid_parameter),self.HEADERS).text)['data']['tabsInfo']['tabs']
        for tab in tabs:
            if tab['tabKey'] == "weibo" and tab['title'] == "微博":
                return tab['containerid']
        return
    def get_weibo_containerid_by_uid_and_split(self,uid_parameter):
        return '107603' + str(uid_parameter)    
    #___________________________________________________________________________________________________________________
    #@ uid    =>    title='主页' 的 containerid 
        ''' 功能：#!(暂不用) 由 uid 获取 title='主页' 的 containerid
            参数：
                uid_parameter：
            返回：
                字符串
            '''
    def get_zhuye_containerid_by_uid(self,uid_parameter):
        response = requests.get('https://m.weibo.cn/api/container/getIndex?type=uid&value='+str(uid_parameter),self.HEADERS)
        if str(response)!='<Response [200]>':
            print(response)
            print("获取用户 = " + uid_parameter + "，title = '主页' 的 containerid 失败！")
            return
        data = json.loads(response.text)
        ok = data['ok']
        if ok != 1:
            print("获取用户 = " + uid_parameter + "，title = '主页' 的 containerid 失败！")
            return
        tabs = data['data']['tabsInfo']['tabs']
        for tab in tabs:
            if tab['tabKey'] == "profile" and tab['title'] == "主页":
                return tab['containerid']
        print("用户 = " + uid_parameter + "，title = '主页' 的 containerid 不存在！")
        return
    def get_zhuye_containerid_by_uid_and_shortcode(self,uid_parameter):
        tabs = json.loads(requests.get('https://m.weibo.cn/api/container/getIndex?type=uid&value='+str(uid_parameter),self.HEADERS).text)['data']['tabsInfo']['tabs']
        for tab in tabs:
            if tab['tabKey'] == 'profile' and tab['title'] == "主页":
                return tab['containerid']
        return
    def get_zhuye_containerid_by_uid_and_split(self,uid_parameter):
        return '230283' + str(uid_parameter)   
    #___________________________________________________________________________________________________________________
    #@ title='主页' 的 containerid    =>    "查看所有微博" 的 containerid 
        ''' 功能：#!(暂不用) 从用户主页下，寻找 "查看其它微博" 的 url，从而找到 "查看所有微博" 的 containerid
            参数：
                containerid_zhuye：主页的 containerid
            返回：
                字符串："查看所有微博" 的 containerid
            '''
    def get_all_weibo_containerid_by_zhuye(self,containerid_zhuye):
        # url
        url = 'https://m.weibo.cn/api/container/getIndex?containerid=' + str(containerid_zhuye)
        # 响应数据
        response = requests.get(url,self.HEADERS)
        if str(response)!='<Response [200]>':
            print(response)
            print("获取主页 = " + containerid_zhuye + " 失败！")
            return
        # 化为字典    
        data = json.loads(response.text)
        # 再次检查
        ok = data['ok']
        if ok != 1:
            print("获取主页 = " + containerid_zhuye + " 失败！")
            return
        # 数据定位
        datasets = data['data']['cards']
        # 逐个检查：（1. 在scheme中获取）（2. 在actionlog中获取）但都需要字符串操作
        for dataset in datasets:
            # 关键点，确定 "more_weibo"
            if dataset['itemid'] == 'more_weibo':
                # 确认检查 title
                if dataset['title'] == '查看他的全部微博':
                    # 确定需要内容的首尾位置
                    start = dataset['scheme'].index("containerid=") + 12
                    end = dataset['scheme'].index("_-_WEIBO")
                    # weibo 的 containerid 是16位数字
                    if end == start + 16:
                        return dataset['scheme'][start:end]
        print("获取主页 = " + containerid_zhuye + " 的 微博containerid 失败！")
        return
    #___________________________________________________________________________________________________________________
    #@ uid    =>    "查看所有微博" 的 containerid 
        ''' 功能：由 uid 获取 "查看所有微博" 的 containerid
            参数：
                uid_parameter：
            返回：
                字符串："查看所有微博" 的 containerid
            '''
    def get_all_weibo_containerid_by_uid_and_split(self,uid_parameter):
        return '230413' + str(uid_parameter)
    #___________________________________________________________________________________________________________________
    #@ uid    =>    "查看所有微博" 当前 page 的 mblogs
        ''' 功能：接收 1个 uid，获取当前页的 more_weibo 所有微博 的 所有内容
            参数：
                uid_parameter： 用户id
            返回：
                mblogs：
            注意：
                uid：（1个）
                mblogs：（多个，list）
            '''
    def get_mblogs_by_uid(self,uid_parameter,page):
        # 访问路径，页码从 i+1 开始
        url = r'https://m.weibo.cn/api/container/getIndex?containerid='+str(self.get_all_weibo_containerid_by_uid_and_split(uid_parameter))+'&page='+str(page)
        # 收到响应
        response = requests.get(url,headers=self.HEADERS)
        if str(response)!='<Response [200]>':
            print(response)
            print("请求 “所有微博” 第 %d 页，失败！"%page)
            return
        # 数据格式转换：（json —— 字典）
        datas = json.loads(response.text)['data']['cards']
        return datas
    #___________________________________________________________________________________________________________________
    #@ mid    =>    微博 当前page的 repost_info
        ''' 功能：接收 1个 mid，获取微博所有的转发信息，包括微博mid、微博发布人、转发人...
            参数：
                mid_parameter：微博内容 id
            返回：
                data：         
            注意：
                mid_parameter：（1个）
                data：（多个，list）
            '''
    def get_repost_info_by_mid(self,mid_parameter,page):
        # 访问路径，页码从 i+1 开始
        url = 'https://m.weibo.cn/api/statuses/repostTimeline?id='+str(mid_parameter)+'&page='+str(page)
        # 收到响应
        response = requests.get(url,headers=self.HEADERS)
        # 打印异常response
        if str(response)!='<Response [200]>':
            print(response)
            print("获取 " + mid_parameter + " 第 " + str(page) + " 页 repost_info，数据异常！")
            return
        # 数据格式转换：（json —— 字典）
        data = json.loads(response.text)
        return data
    #___________________________________________________________________________________________________________________
    #@ uid    =>    user-info
    def get_user_info_by_uid(self,uid):
        #// 1. 获得 url
        url = 'https://m.weibo.cn/api/container/getIndex?type=uid&value='+str(uid)
        #// 2. 获取响应数据
        response = requests.get(url,headers=self.HEADERS)
        if str(response)!='<Response [200]>':
            print(response)
            print("获取用户 " + str(uid) + ' 相关信息失败！')
            return
        #// 将 json 改为 字典数据
        data = json.loads(response.text)
        return data
    #___________________________________________________________________________________________________________________
    #@ nickname    =>    uid-exact
    def get_uid_by_nickname_and_exact(self,name,page):
        #// 1. 获得 url
        url = 'https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D3%26q%3D' + name + '%26t%3D0&page_type=searchall&page=' + str(page)
        #// 2. 获取响应数据
        response = requests.get(url,headers=self.HEADERS)
        if str(response)!='<Response [200]>':
            print(response)
            print("获取 " + name + " UID 失败！")
            return
        #// 将 json 改为 字典数据
        data = json.loads(response.text)
        return data
    #___________________________________________________________________________________________________________________
    #@ nickname    =>    uid-fuzzy
    def get_uid_by_nickname_and_fuzzy(self,name,page):
        #// 1. 获得 url
        url = 'https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D3%26q%3D' + name + '%26t%3D0&page_type=searchall&page=' + str(page)
        #// 2. 获取响应数据
        response = requests.get(url,headers=self.HEADERS)
        if str(response)!='<Response [200]>':
            print(response)
            print("获取 " + name + " 相关 UID 失败！")
            return
        #// 将 json 改为 字典数据
        data = json.loads(response.text)
        return data